#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
数据库初始化脚本
创建默认角色、权限和管理员用户
"""

import os
import sys
from app import create_app
from models import db, User, Role, Permission


def init_db():
    """初始化数据库"""
    app = create_app('development')
    with app.app_context():
        # 创建所有表
        db.create_all()
        
        # 创建默认权限
        create_default_permissions()
        
        # 创建默认角色
        create_default_roles()
        
        # 创建管理员用户
        create_admin_user()
        
        print("数据库初始化完成！")


def create_default_permissions():
    """创建默认权限"""
    # 检查是否已存在权限
    if Permission.query.count() > 0:
        print("权限已存在，跳过创建默认权限")
        return
    
    # 定义默认权限
    default_permissions = [
        # 用户资源权限
        {'name': 'user:create', 'resource': 'user', 'action': 'create', 'description': '创建用户'},
        {'name': 'user:read', 'resource': 'user', 'action': 'read', 'description': '查看用户'},
        {'name': 'user:update', 'resource': 'user', 'action': 'update', 'description': '更新用户'},
        {'name': 'user:delete', 'resource': 'user', 'action': 'delete', 'description': '删除用户'},
        
        # 角色资源权限
        {'name': 'role:create', 'resource': 'role', 'action': 'create', 'description': '创建角色'},
        {'name': 'role:read', 'resource': 'role', 'action': 'read', 'description': '查看角色'},
        {'name': 'role:update', 'resource': 'role', 'action': 'update', 'description': '更新角色'},
        {'name': 'role:delete', 'resource': 'role', 'action': 'delete', 'description': '删除角色'},
        
        # 权限资源权限
        {'name': 'permission:create', 'resource': 'permission', 'action': 'create', 'description': '创建权限'},
        {'name': 'permission:read', 'resource': 'permission', 'action': 'read', 'description': '查看权限'},
        {'name': 'permission:update', 'resource': 'permission', 'action': 'update', 'description': '更新权限'},
        {'name': 'permission:delete', 'resource': 'permission', 'action': 'delete', 'description': '删除权限'},
        
        # 内容资源权限（示例）
        {'name': 'content:create', 'resource': 'content', 'action': 'create', 'description': '创建内容'},
        {'name': 'content:read', 'resource': 'content', 'action': 'read', 'description': '查看内容'},
        {'name': 'content:update', 'resource': 'content', 'action': 'update', 'description': '更新内容'},
        {'name': 'content:delete', 'resource': 'content', 'action': 'delete', 'description': '删除内容'},
        {'name': 'content:publish', 'resource': 'content', 'action': 'publish', 'description': '发布内容'},
    ]
    
    # 创建权限
    for perm_data in default_permissions:
        permission = Permission(
            name=perm_data['name'],
            resource=perm_data['resource'],
            action=perm_data['action'],
            description=perm_data['description']
        )
        db.session.add(permission)
    
    db.session.commit()
    print(f"已创建 {len(default_permissions)} 个默认权限")


def create_default_roles():
    """创建默认角色"""
    # 检查是否已存在角色
    if Role.query.count() > 0:
        print("角色已存在，跳过创建默认角色")
        return
    
    # 创建管理员角色
    admin_role = Role(name='admin', description='管理员')
    # 为管理员角色添加所有权限
    admin_role.permissions = Permission.query.all()
    db.session.add(admin_role)
    
    # 创建编辑者角色
    editor_role = Role(name='editor', description='编辑者')
    # 为编辑者角色添加内容相关权限和role:read权限
    content_permissions = Permission.query.filter(
        Permission.resource == 'content'
    ).all()
    role_read_permission = Permission.query.filter_by(name='role:read').first()
    editor_permissions = content_permissions + [role_read_permission] if role_read_permission else content_permissions
    editor_role.permissions = editor_permissions
    db.session.add(editor_role)
    
    # 创建普通用户角色
    user_role = Role(name='user', description='普通用户')
    # 为普通用户添加基本权限
    user_role.permissions = [
        Permission.query.filter_by(name='content:read').first(),
        Permission.query.filter_by(name='user:read').first()
    ]
    db.session.add(user_role)
    
    db.session.commit()
    print("已创建默认角色: admin, editor, user")


def create_admin_user():
    """创建管理员用户"""
    # 检查是否已存在管理员用户
    admin_exists = User.query.filter_by(username='admin').first()
    if admin_exists:
        print("管理员用户已存在，跳过创建")
        return
    
    # 获取管理员角色
    admin_role = Role.query.filter_by(name='admin').first()
    if not admin_role:
        print("错误：管理员角色不存在，请先创建角色")
        return
    
    # 创建管理员用户
    admin_user = User(
        username='admin',
        email='admin@example.com',
        password='admin123',  # 在生产环境中应使用更强的密码
        roles=[admin_role]
    )
    
    db.session.add(admin_user)
    db.session.commit()
    print("已创建管理员用户: admin (密码: admin123)")


if __name__ == '__main__':
    init_db()